--***********************************************************
--**              	  ROBERT JOHNSON                       **
--***********************************************************

ISMiniScoreboardUI = ISPanel:derive("ISMiniScoreboardUI");
ISMiniScoreboardUI.messages = {};

local FONT_HGT_SMALL = getTextManager():getFontHeight(UIFont.Small)

--************************************************************************--
--** ISMiniScoreboardUI:initialise
--**
--************************************************************************--

function ISMiniScoreboardUI:initialise()
    ISPanel.initialise(self);
    local btnWid = 80
    local btnHgt = FONT_HGT_SMALL + 2

    local y = 10 + FONT_HGT_SMALL + 10
    self.playerList = ISScrollingListBox:new(10, y, self.width - 20, self.height - (5 + btnHgt + 5) - y);
    self.playerList:initialise();
    self.playerList:instantiate();
    self.playerList.itemheight = FONT_HGT_SMALL + 2 * 2;
    self.playerList.selected = 0;
    self.playerList.joypadParent = self;
    self.playerList.font = UIFont.NewSmall;
    self.playerList.doDrawItem = self.drawPlayers;
    self.playerList.drawBorder = true;
    self.playerList.onRightMouseUp = ISMiniScoreboardUI.onRightMousePlayerList;
    self:addChild(self.playerList);

    self.no = ISButton:new(self.playerList.x + self.playerList.width - btnWid, self.playerList.y + self.playerList.height + 5, btnWid, btnHgt, getText("UI_btn_close"), self, ISMiniScoreboardUI.onClick);
    self.no.internal = "CLOSE";
    self.no.anchorTop = false
    self.no.anchorBottom = true
    self.no:initialise();
    self.no:instantiate();
    self.no.borderColor = {r=0.4, g=0.4, b=0.4, a=0.9};
    self:addChild(self.no);

    scoreboardUpdate()
end

function ISMiniScoreboardUI:onRightMousePlayerList(x, y)
    local row = self:rowAt(x, y)
    if row < 1 or row > #self.items then return end
    self.selected = row
    local scoreboard = self.parent
    scoreboard:doPlayerListContextMenu(self.items[row].item, self:getX() + x, self:getY() + y)
end

function ISMiniScoreboardUI:doPlayerListContextMenu(player, x,y)
    local playerNum = self.admin:getPlayerNum()
    local context = ISContextMenu.get(playerNum, x + self:getAbsoluteX(), y + self:getAbsoluteY());
    context:addOption(getText("UI_Scoreboard_Teleport"), self, ISMiniScoreboardUI.onCommand, player, "TELEPORT");
    context:addOption(getText("UI_Scoreboard_TeleportToYou"), self, ISMiniScoreboardUI.onCommand, player, "TELEPORTTOYOU");
    context:addOption(getText("UI_Scoreboard_Invisible"), self, ISMiniScoreboardUI.onCommand, player, "INVISIBLE");
    context:addOption(getText("UI_Scoreboard_GodMod"), self, ISMiniScoreboardUI.onCommand, player, "GODMOD");
    context:addOption("Check Stats", self, ISMiniScoreboardUI.onCommand, player, "STATS");
end

function ISMiniScoreboardUI:onCommand(player, command)
    if command == "TELEPORT" then
        SendCommandToServer("/teleport \"" .. player.displayName .. "\"");
    elseif command == "TELEPORTTOYOU" then
        SendCommandToServer("/teleport \"" .. player.displayName .. "\" \"" .. self.admin:getDisplayName() .. "\"");
    elseif command == "INVISIBLE" then
        SendCommandToServer("/invisible \"" .. player.displayName .. "\"");
    elseif command == "GODMOD" or command == "GODMODE" then
        SendCommandToServer("/godmod \"" .. player.displayName .. "\"");
    elseif command == "STATS" then
        local playerObj = getPlayerFromUsername(player.username)
        if not playerObj then return end -- player hasn't been encountered yet
        local ui = ISPlayerStatsUI:new(50,50,800,800, playerObj, self.admin)
        ui:initialise();
        ui:addToUIManager();
        ui:setVisible(true);
    end
end

function ISMiniScoreboardUI:populateList()
    self.playerList:clear();
    if not self.scoreboard then return end
    for i=1,self.scoreboard.usernames:size() do
        local username = self.scoreboard.usernames:get(i-1)
        local displayName = self.scoreboard.displayNames:get(i-1)
        if username ~= self.admin:getUsername() then
            local item = {}
            local name = displayName
            item.username = username
            item.displayName = displayName
--            if username ~= displayName then
--                name = displayName .. " (" .. username .. ")";
--            end
            local item0 = self.playerList:addItem(name, item);
            if username ~= displayName then
                item0.tooltip = username
            end
        end
    end
end

function ISMiniScoreboardUI:drawPlayers(y, item, alt)
    local a = 0.9;

    self:drawRectBorder(0, (y), self:getWidth(), self.itemheight - 1, a, self.borderColor.r, self.borderColor.g, self.borderColor.b);

    if self.selected == item.index then
        self:drawRect(0, (y), self:getWidth(), self.itemheight - 1, 0.3, 0.7, 0.35, 0.15);
    end

    self:drawText(item.text, 10, y + 2, 1, 1, 1, a, self.font);

    return y + self.itemheight;
end

function ISMiniScoreboardUI:prerender()
    local z = 10;
    self:drawRect(0, 0, self.width, self.height, self.backgroundColor.a, self.backgroundColor.r, self.backgroundColor.g, self.backgroundColor.b);
    self:drawRectBorder(0, 0, self.width, self.height, self.borderColor.a, self.borderColor.r, self.borderColor.g, self.borderColor.b);
    self:drawText(getText("IGUI_AdminPanel_MiniScoreboard"), self.width/2 - (getTextManager():MeasureStringX(UIFont.Small, getText("IGUI_AdminPanel_MiniScoreboard")) / 2), z, 1,1,1,1, UIFont.Small);
end

function ISMiniScoreboardUI:onClick(button)
    if button.internal == "CLOSE" then
        self:close()
    end
end

function ISMiniScoreboardUI:close()
    self:setVisible(false)
    self:removeFromUIManager()
    ISMiniScoreboardUI.instance = nil
end

--************************************************************************--
--** ISMiniScoreboardUI:new
--**
--************************************************************************--
function ISMiniScoreboardUI:new(x, y, width, height, admin)
    local o = {}
    o = ISPanel:new(x, y, width, height);
    setmetatable(o, self)
    self.__index = self
    if y == 0 then
        o.y = o:getMouseY() - (height / 2)
        o:setY(o.y)
    end
    if x == 0 then
        o.x = o:getMouseX() - (width / 2)
        o:setX(o.x)
    end
    o.borderColor = {r=0.4, g=0.4, b=0.4, a=1};
    o.backgroundColor = {r=0, g=0, b=0, a=0.8};
    o.width = width;
    o.height = height;
    o.admin = admin;
    o.moveWithMouse = true;
    o.scoreboard = nil
    ISMiniScoreboardUI.instance = o;
    return o;
end

function ISMiniScoreboardUI.onScoreboardUpdate(usernames, displayNames, steamIDs)
    if ISMiniScoreboardUI.instance then
        ISMiniScoreboardUI.instance.scoreboard = {}
        ISMiniScoreboardUI.instance.scoreboard.usernames = usernames
        ISMiniScoreboardUI.instance.scoreboard.displayNames = displayNames
        ISMiniScoreboardUI.instance.scoreboard.steamIDs = steamIDs
        ISMiniScoreboardUI.instance:populateList();
    end
end

ISMiniScoreboardUI.OnMiniScoreboardUpdate = function()
    if ISMiniScoreboardUI.instance then
        scoreboardUpdate()
    end
end

Events.OnScoreboardUpdate.Add(ISMiniScoreboardUI.onScoreboardUpdate)
Events.OnMiniScoreboardUpdate.Add(ISMiniScoreboardUI.OnMiniScoreboardUpdate)
